package com.aq.syn;

/**
 * 不安全的取钱
 * 线程的内存都是各自的，互不影响的
 */
public class UnsafeBank {

    public static void main(String[] args) {
        //账户
        Account account = new Account(200, "结婚基金");
        Drawing you = new Drawing(account, 150, "自己");
        Drawing girlFriend = new Drawing(account, 100, "girlFriend");

        you.start();
        girlFriend.start();
    }

}

/**
 * 账户
 */
class Account {

    int money; // 余额
    String name;// 卡名

    public Account(int money, String name) {
        this.money = money;
        this.name = name;
    }

}

/**
 * 银行：取款
 */
class Drawing extends Thread {

    Account account; // 账户
    int drawingMoney; // 取了多少钱
    int nowMoney; // 现在手里有多少钱

    public Drawing(Account account, int drawingMoney, String name) {
        super(name);
        this.account = account;
        this.drawingMoney = drawingMoney;
    }

    // synchronized 默认锁的是 this
    @Override
    public void run() {

        // 锁的对象就是变化的量，需要 增、删、改 的对象
        synchronized (account) {
            // 判断 有没有钱
            if (account.money - drawingMoney < 0) {
                System.out.println(Thread.currentThread().getName() + "的账户钱不够了，取不到");
                return;
            }

            // sleep() 可以放大问题的发生性
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 卡内余额  = 余额 - 取出的钱
            account.money = account.money - drawingMoney;

            // 手里的钱 = 现有的钱 + 取出的钱
            nowMoney = nowMoney + drawingMoney;

            System.out.println(account.name + "的余额为：" + account.money);

            // Thread.currentThread().getName() = this.getName()
            System.out.println(this.getName() + "手里钱为：" + nowMoney);

        }


    }
}